package com.lqq.chapter12;

import java.util.concurrent.CompletableFuture;

/**
 * @Author lqq677
 * @Date 2021/8/12 23:07
 * @Description 有返回值的异步任务
 */
public class CompletableFutureDemo3 {

    public static void main(String[] args) throws Exception {

        System.out.println("主线程开始");

        /**
         * 返回一个新的 CompletableFuture，它由在ForkJoinPool.commonPool()运行的任务异步完成，其值是通过调用给定的供应商获得的。
         * 参数：
         * 供应商 - 一个函数，返回用于完成返回的 CompletableFuture 的值
         * 类型参数：
         * <U> - 函数的返回类型
         * 返回：
         * 新的 CompletableFuture
         *
         *  public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
         *      return asyncSupplyStage(asyncPool, supplier);
         *  }
         *
         * @FunctionalInterface //函数式接口
         * public interface Supplier<T> {
         *    T get ();
         * }
         *
         */
        //运行一个有返回值的异步任务
        CompletableFuture future = CompletableFuture.supplyAsync(() -> {
            try {
                System.out.println("子线程开始任务...");
                Thread.sleep(5000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "子线程完成了...";
        });

        //主线程阻塞
        String s = (String) future.get();
        System.out.println("主线程结束, 子线程的结果为:" + s);


    }
}
